iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0

LocationManagerService

定位系統概觀

Android 的定位框架是整個行動生態系的基石之一。從地圖導航、運動追蹤、相機地理標記,到智慧家居自動化與行銷推播,幾乎所有需要「地理位置」的功能,都依賴於 LocationManagerService (LMS) 這項系統服務。
Android 的定位系統架構可分為以下幾層:

+----------------------------------------------------+
|                    Applications                    |
|   (Google Maps, Fitness, Ride-hailing, etc.)       |
+----------------------------------------------------+
|          LocationManager & FusedLocationProvider   |
|                 (Java Framework API)               |
+----------------------------------------------------+
|             LocationManagerService (System)        |
|   - Provider 管理 (GPS / Network / Passive / Fused) |
|   - 權限控制、Request 排程、Callback 分派             |
+----------------------------------------------------+
|          Location Providers (Native 層模組)         |
|   - GpsLocationProvider / GnssLocationProvider     |
|   - NetworkLocationProvider / FusedProvider        |
+----------------------------------------------------+
|          HAL (Hardware Abstraction Layer)          |
|   - android.hardware.gnss@X.Y                      |
+----------------------------------------------------+
|                   Linux Kernel                     |
|   - GNSS Driver / Modem Interface / Power Control  |
+----------------------------------------------------+

主要組成元件與職責

LocationManager (App 層 API)

  • 位於 Framework API 層,開發者透過它向系統請求定位資訊。
  • 主要方法:
    • requestLocationUpdates()
    • getLastKnownLocation()
    • removeUpdates()
  • 實際執行時,會透過 Binder IPC 呼叫到 LocationManagerService。

LocationManagerService (系統服務層)

  • 是 Framework 與 Native 定位模組之間的核心中介。
  • 職責:
    • 管理所有定位 Provider(GPS、Network、Passive、Fused)。
    • 維護使用者與應用的 Location Request 清單。
    • 控制權限、安全性與電源策略。
    • 分派更新結果給各個客戶端。

Location Provider 模組

  • 負責實際獲取位置資訊。
  • 常見 Provider:
    • GPS Provider (GnssLocationProvider):透過衛星訊號提供精確定位。
    • Network Provider:根據基地台與 Wi-Fi 資訊估算位置。
    • Passive Provider:監聽其他 Provider 的輸出。
    • Fused Provider:Google Play Services 提供的整合版本,會結合感測器、網路與 GPS。

GNSS HAL

  • 提供 Framework 與 GPS 晶片之間的介面。
  • 例如:
    • hardware/interfaces/gnss/1.1/
  • 提供一系列如:
    • IGnssCallback
    • IGnssMeasurement
    • IGnssConfiguration
      等接口,透過 HIDL/AIDL 溝通。

定位流程

以下是 Android 定位的一般流程圖:

+--------------------------------+
|     App (LocationManager)      |
| requestLocationUpdates()       |
+--------------|-----------------+
               |
        Binder IPC
               v
+--------------------------+
|   LocationManagerService |
|  - 驗證權限               |
|  - 選擇 Provider         |
|  - 維護 Request 列表      |
+--------------|-----------+
               |
     Binder / JNI 呼叫
               v
+-------------------------+
|  GnssLocationProvider   |
|  (或 NetworkProvider)   |
+--------------|----------+
               |
     HAL interface (AIDL/HIDL)
               v
+-------------------------+
|   GNSS HAL / Driver     |
|   (與衛星晶片互動)        |
+--------------|----------+
               |
               v
+-------------------------+
|     Hardware Layer      |
|    GPS Receiver Module  |
+-------------------------+

當系統取得新位置時,會反向將結果回傳至:

  • LocationManagerService → 呼叫對應的回調(ILocationListener)
  • 應用層接收到更新的 Location 物件。

LocationManagerService 核心模組剖析

LMS 位於:
frameworks/base/services/core/java/com/android/server/location/LocationManagerService.java

(1) 啟動階段
SystemServer 啟動:
mSystemServiceManager.startService(LocationManagerService.class);
在初始化時會:

  • 建立各 Provider 物件。
  • 註冊 LocationProviderManager。
  • 建立 LocationRequestHelper。
  • 掃描已啟用的 Provider 清單。

(2) Request 與更新管理
App 透過 Binder 請求定位時,LMS 會:

  • 驗證權限 (ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION)。
  • 檢查 App 是否啟用位置功能。
  • 建立一個 Request 實體(包含頻率、優先權、最小距離等)。
  • 分派給對應 Provider。
    Provider 偵測到位置更新時:
  • 透過 callback 回傳結果 (onLocationChanged()),
  • LMS 收到後再將資料廣播或 callback 到應用層。

(3) 多 Provider 策略
Android 支援同時啟用多種 Provider。LMS 的策略為:

  • Fused Provider 優先(若使用 Google Play Services)。
  • 若僅限開源 AOSP,則以 GPS + Network 組合策略為主。
  • 若有 Passive Provider,則可同步監聽他人結果以節省電力。

權限與安全性

定位資訊涉及隱私,因此系統在多層防護:

  • 權限檢查
    • 精準定位:ACCESS_FINE_LOCATION
    • 粗略定位:ACCESS_COARSE_LOCATION
    • 背景定位:ACCESS_BACKGROUND_LOCATION
  • 使用者授權控制
    • Android 10 起引入「只允許使用中」與「一次性授權」。
    • AppOpsManager 負責實際運作時的權限驗證。
  • 隱私強化
    • Android 12 引入模糊位置(Approximate location)。
    • LocationManagerService 會根據 App 等級與前後台狀態決定回傳精度。

GPS 與 Network Provider 比較

特性 GPS Provider Network Provider
資料來源 衛星 Wi-Fi / 基地台
精確度 高 (< 10m) 中等 (50~200m)
延遲 高 (需定位時間) 快速
室內可用性
電量消耗
典型用途 導航、運動追蹤 城市地圖、背景定位

Android 系統通常會根據 LocationRequest 的優先等級自動選擇最適 Provider:

  • PRIORITY_HIGH_ACCURACY → GPS
  • PRIORITY_BALANCED_POWER_ACCURACY → Network / Fused
  • PRIORITY_LOW_POWER → Passive

與 FusedLocationProvider 的關係

雖然 AOSP 提供基本的 LMS,但實際上多數裝置會採用 Google Play Services 的 FusedLocationProvider,其特點:

  • 整合 GPS、Wi-Fi、Cell、Sensor。
  • 根據情境智慧選擇 Provider。
  • 自動做 energy trade-off(以節能為優先)。
    Framework 層面上,LMS 會轉發部分請求至 Fused Provider,使其替代傳統 GPS / Network Provider。

電源管理與省電策略

定位是耗電大戶,因此 LMS 會與 PowerManagerService 與 AlarmManagerService 協同控制:

  • 若螢幕關閉且無活動請求,暫停定位。
  • 若為「定時更新」型 Request,透過 AlarmManager 喚醒。
  • 低電量模式下會降低定位頻率。
    Android 13 之後引入 Adaptive Location,根據行為、時間與應用優先權動態調整更新頻率。

測試與分析工具

過去 Android 提供 Battery Historian 分析定位耗電,但目前已不再維護。Google 官方建議改用:

  • System Tracing (systrace):追蹤位置更新與 Binder 流程。
  • Macrobenchmark:量測應用定位 API 對電源影響。
  • Battery Usage Analyzer:在 Settings → Battery → App usage 可觀察定位耗電占比。

summary

層級 模組 功能摘要
應用層 LocationManager 開發者 API,向系統請求定位
Framework LocationManagerService 管理權限、Provider、回傳結果
Native 層 Gnss / Network Provider 與 HAL 互動,獲取位置資料
HAL 層 GNSS HAL 與硬體 GPS 晶片通訊
Kernel GNSS Driver 控制接收器與功耗管理

Android 的定位架構是「高階封裝、低階驅動」的典範,它整合了軟硬體協作、權限與能耗策略,並提供一致的 API 給開發者使用。
而在現代裝置中,Google 的 FusedLocationProvider 進一步將多源感測資料融合,使定位更智慧、更節能。


上一篇
#20
系列文
安豬複習22
  1. 18
    #17
  2. 19
    #18
  3. 20
    #19
  4. 21
    #20
  5. 22
    #21
完整目錄
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言